package msgdef

import (
	"reflect"
	"src/zeus/bytestream"
)

type ICommonMsg interface {
	IMsg
	bytestream.IMarshalIgnoreField
	initMsgRealPtr(realPtr interface{})
}

func IsCommonMsg(outer interface{}) bool {
	_, ok := outer.(ICommonMsg)
	return ok
}

func TryInitCommonMsg(outer interface{}) bool {
	if im, ok := outer.(ICommonMsg); ok {
		im.initMsgRealPtr(outer)
		return true
	}
	return false
}

var _ ICommonMsg = &CommonMsg{}

// 申请关卡
type CommonMsg struct {
	_realPtr interface{}
}

func (msg *CommonMsg) initMsgRealPtr(realPtr interface{}) {
	msg._realPtr = realPtr
}

func (msg CommonMsg) MarshalIgnoreThis() {
}

// Name 消息名
func CommonMsgEqualSlow(this, other interface{}) bool {
	ov := reflect.ValueOf(other).Elem()
	v := reflect.ValueOf(this).Elem()
	for i := 0; i < v.NumField(); i++ {
		vf := v.Field(i)

		if vf.CanAddr() {
			if _, ok := vf.Addr().Interface().(bytestream.IMarshalIgnoreField); ok {
				continue
			}
		}

		if ov.Field(i).Interface() != vf.Interface() {
			return false
		}

	}
	return true
}
func (msg *CommonMsg) Name() string {
	s := reflect.TypeOf(msg._realPtr).String()
	i := len(s) - 1
	for i >= 0 {
		if s[i] == '.' {
			break
		}
		i--
	}
	return s[i+1:]
}

// MarshalTo 序列化
func (msg *CommonMsg) MarshalTo(data []byte) (n int, err error) {
	bw := bytestream.NewByteStream(data)
	return msg.Size(), bw.Marshal(msg._realPtr)
}

// Unmarshal 反序列化
func (msg *CommonMsg) Unmarshal(data []byte) error {

	sw := bytestream.NewByteStream(data)
	return sw.Unmarshal(msg._realPtr)
}

// Size 获取长度
func (msg *CommonMsg) Size() (n int) {
	return bytestream.CalcSize(msg._realPtr)
}
